{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 角度1：按照功能不同举例",
   "id": "64ad6dff1308a367"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 1.1非对话模型",
   "id": "3ee25b72cf18e64b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T22:48:10.795813Z",
     "start_time": "2025-10-20T22:48:07.226385Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import ChatOpenAI\n",
    "dotenv.load_dotenv()\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"DASHSCOPE_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    "###########核心代码############\n",
    "llm = ChatOpenAI(model=\"qwen-max\")\n",
    "str = llm.invoke(\"写一首关于春天的诗\") # 直接输入字符串\n",
    "print(str.content)"
   ],
   "id": "a387b55adcfb9c41",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "春风吹绿江南岸，万物复苏展新颜。\n",
      "细雨轻拂桃花面，柳絮飘飞似雪绵。\n",
      "\n",
      "燕子归来寻旧巢，蜜蜂忙碌采花间。\n",
      "儿童嬉戏草地上，笑声如铃乐无边。\n",
      "\n",
      "江水潺潺带春意，山色空蒙笼翠烟。\n",
      "人间四月芳菲尽，唯有春光共长天。\n"
     ]
    }
   ],
   "execution_count": 35
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 1.2：Chat Models(对话模型)",
   "id": "d2e971e00f64ac0a"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T00:19:41.923102Z",
     "start_time": "2025-10-20T00:19:40.981631Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "from langchain_core.messages import SystemMessage, HumanMessage\n",
    "import os\n",
    "import dotenv\n",
    "dotenv.load_dotenv()\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"DASHSCOPE_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    "########核心代码############\n",
    "chat_model = ChatOpenAI(model=\"qwen-max\")\n",
    "messages = [\n",
    "SystemMessage(content=\"我是人工智能助手，我叫小智\"),\n",
    "HumanMessage(content=\"你好，我是小明，很高兴认识你\")\n",
    "]\n",
    "response = chat_model.invoke(messages) # 输入消息列表\n",
    "print(type(response)) # <class 'langchain_core.messages.ai.AIMessage'>\n",
    "print(response.content)"
   ],
   "id": "c4b8a3dfb75bcecc",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'langchain_core.messages.ai.AIMessage'>\n",
      "你好，小明！我是小智，也很高兴认识你。有什么我可以帮助你的吗？\n"
     ]
    }
   ],
   "execution_count": 8
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 1.3：Embedding Model(嵌入模型)",
   "id": "ae19d5851ce691c7"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T07:21:27.617316Z",
     "start_time": "2025-10-20T07:21:26.615796Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import OpenAIEmbeddings\n",
    "dotenv.load_dotenv()\n",
    "os.environ['OPENAI_API_KEY'] = os.getenv(\"OPENAI_API_KEY1\")\n",
    "os.environ['OPENAI_BASE_URL'] = os.getenv(\"OPENAI_BASE_URL\")\n",
    "#############\n",
    "embeddings_model = OpenAIEmbeddings(\n",
    "model=\"text-embedding-ada-002\"\n",
    ")\n",
    "res1 = embeddings_model.embed_query('我是文档中的数据')\n",
    "print(res1)\n",
    "# 打印结果：[-0.004306625574827194, 0.003083756659179926, -0.013916781172156334, ...., ]"
   ],
   "id": "9f3598c4a18b2464",
   "outputs": [
    {
     "ename": "AuthenticationError",
     "evalue": "Error code: 401 - {'error': {'message': 'Incorrect API key provided. ', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_api_key'}, 'request_id': '1a619334-e4fd-49a0-914a-47cdb2574fa9'}",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mAuthenticationError\u001B[0m                       Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[24], line 11\u001B[0m\n\u001B[0;32m      7\u001B[0m \u001B[38;5;66;03m#############\u001B[39;00m\n\u001B[0;32m      8\u001B[0m embeddings_model \u001B[38;5;241m=\u001B[39m OpenAIEmbeddings(\n\u001B[0;32m      9\u001B[0m model\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtext-embedding-ada-002\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m     10\u001B[0m )\n\u001B[1;32m---> 11\u001B[0m res1 \u001B[38;5;241m=\u001B[39m \u001B[43membeddings_model\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43membed_query\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43m我是文档中的数据\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[0;32m     12\u001B[0m \u001B[38;5;28mprint\u001B[39m(res1)\n\u001B[0;32m     13\u001B[0m \u001B[38;5;66;03m# 打印结果：[-0.004306625574827194, 0.003083756659179926, -0.013916781172156334, ...., ]\u001B[39;00m\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_openai\\embeddings\\base.py:638\u001B[0m, in \u001B[0;36mOpenAIEmbeddings.embed_query\u001B[1;34m(self, text, **kwargs)\u001B[0m\n\u001B[0;32m    628\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21membed_query\u001B[39m(\u001B[38;5;28mself\u001B[39m, text: \u001B[38;5;28mstr\u001B[39m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs: Any) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mlist\u001B[39m[\u001B[38;5;28mfloat\u001B[39m]:\n\u001B[0;32m    629\u001B[0m \u001B[38;5;250m    \u001B[39m\u001B[38;5;124;03m\"\"\"Call out to OpenAI's embedding endpoint for embedding query text.\u001B[39;00m\n\u001B[0;32m    630\u001B[0m \n\u001B[0;32m    631\u001B[0m \u001B[38;5;124;03m    Args:\u001B[39;00m\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    636\u001B[0m \u001B[38;5;124;03m        Embedding for the text.\u001B[39;00m\n\u001B[0;32m    637\u001B[0m \u001B[38;5;124;03m    \"\"\"\u001B[39;00m\n\u001B[1;32m--> 638\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39membed_documents([text], \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)[\u001B[38;5;241m0\u001B[39m]\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_openai\\embeddings\\base.py:590\u001B[0m, in \u001B[0;36mOpenAIEmbeddings.embed_documents\u001B[1;34m(self, texts, chunk_size, **kwargs)\u001B[0m\n\u001B[0;32m    587\u001B[0m \u001B[38;5;66;03m# NOTE: to keep things simple, we assume the list may contain texts longer\u001B[39;00m\n\u001B[0;32m    588\u001B[0m \u001B[38;5;66;03m#       than the maximum context and use length-safe embedding function.\u001B[39;00m\n\u001B[0;32m    589\u001B[0m engine \u001B[38;5;241m=\u001B[39m cast(\u001B[38;5;28mstr\u001B[39m, \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mdeployment)\n\u001B[1;32m--> 590\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_get_len_safe_embeddings(\n\u001B[0;32m    591\u001B[0m     texts, engine\u001B[38;5;241m=\u001B[39mengine, chunk_size\u001B[38;5;241m=\u001B[39mchunk_size, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs\n\u001B[0;32m    592\u001B[0m )\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_openai\\embeddings\\base.py:478\u001B[0m, in \u001B[0;36mOpenAIEmbeddings._get_len_safe_embeddings\u001B[1;34m(self, texts, engine, chunk_size, **kwargs)\u001B[0m\n\u001B[0;32m    476\u001B[0m batched_embeddings: \u001B[38;5;28mlist\u001B[39m[\u001B[38;5;28mlist\u001B[39m[\u001B[38;5;28mfloat\u001B[39m]] \u001B[38;5;241m=\u001B[39m []\n\u001B[0;32m    477\u001B[0m \u001B[38;5;28;01mfor\u001B[39;00m i \u001B[38;5;129;01min\u001B[39;00m _iter:\n\u001B[1;32m--> 478\u001B[0m     response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mclient\u001B[38;5;241m.\u001B[39mcreate(\n\u001B[0;32m    479\u001B[0m         \u001B[38;5;28minput\u001B[39m\u001B[38;5;241m=\u001B[39mtokens[i : i \u001B[38;5;241m+\u001B[39m _chunk_size], \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mclient_kwargs\n\u001B[0;32m    480\u001B[0m     )\n\u001B[0;32m    481\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(response, \u001B[38;5;28mdict\u001B[39m):\n\u001B[0;32m    482\u001B[0m         response \u001B[38;5;241m=\u001B[39m response\u001B[38;5;241m.\u001B[39mmodel_dump()\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\openai\\resources\\embeddings.py:129\u001B[0m, in \u001B[0;36mEmbeddings.create\u001B[1;34m(self, input, model, dimensions, encoding_format, user, extra_headers, extra_query, extra_body, timeout)\u001B[0m\n\u001B[0;32m    123\u001B[0m             embedding\u001B[38;5;241m.\u001B[39membedding \u001B[38;5;241m=\u001B[39m np\u001B[38;5;241m.\u001B[39mfrombuffer(  \u001B[38;5;66;03m# type: ignore[no-untyped-call]\u001B[39;00m\n\u001B[0;32m    124\u001B[0m                 base64\u001B[38;5;241m.\u001B[39mb64decode(data), dtype\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mfloat32\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    125\u001B[0m             )\u001B[38;5;241m.\u001B[39mtolist()\n\u001B[0;32m    127\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m obj\n\u001B[1;32m--> 129\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_post\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    130\u001B[0m \u001B[43m    \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43m/embeddings\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[0;32m    131\u001B[0m \u001B[43m    \u001B[49m\u001B[43mbody\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmaybe_transform\u001B[49m\u001B[43m(\u001B[49m\u001B[43mparams\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43membedding_create_params\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mEmbeddingCreateParams\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    132\u001B[0m \u001B[43m    \u001B[49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmake_request_options\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    133\u001B[0m \u001B[43m        \u001B[49m\u001B[43mextra_headers\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_headers\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    134\u001B[0m \u001B[43m        \u001B[49m\u001B[43mextra_query\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_query\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    135\u001B[0m \u001B[43m        \u001B[49m\u001B[43mextra_body\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_body\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    136\u001B[0m \u001B[43m        \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    137\u001B[0m \u001B[43m        \u001B[49m\u001B[43mpost_parser\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mparser\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    138\u001B[0m \u001B[43m    \u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    139\u001B[0m \u001B[43m    \u001B[49m\u001B[43mcast_to\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mCreateEmbeddingResponse\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    140\u001B[0m \u001B[43m\u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\openai\\_base_client.py:1239\u001B[0m, in \u001B[0;36mSyncAPIClient.post\u001B[1;34m(self, path, cast_to, body, options, files, stream, stream_cls)\u001B[0m\n\u001B[0;32m   1225\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mpost\u001B[39m(\n\u001B[0;32m   1226\u001B[0m     \u001B[38;5;28mself\u001B[39m,\n\u001B[0;32m   1227\u001B[0m     path: \u001B[38;5;28mstr\u001B[39m,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m   1234\u001B[0m     stream_cls: \u001B[38;5;28mtype\u001B[39m[_StreamT] \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m,\n\u001B[0;32m   1235\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m ResponseT \u001B[38;5;241m|\u001B[39m _StreamT:\n\u001B[0;32m   1236\u001B[0m     opts \u001B[38;5;241m=\u001B[39m FinalRequestOptions\u001B[38;5;241m.\u001B[39mconstruct(\n\u001B[0;32m   1237\u001B[0m         method\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpost\u001B[39m\u001B[38;5;124m\"\u001B[39m, url\u001B[38;5;241m=\u001B[39mpath, json_data\u001B[38;5;241m=\u001B[39mbody, files\u001B[38;5;241m=\u001B[39mto_httpx_files(files), \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39moptions\n\u001B[0;32m   1238\u001B[0m     )\n\u001B[1;32m-> 1239\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m cast(ResponseT, \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcast_to\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mopts\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream_cls\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream_cls\u001B[49m\u001B[43m)\u001B[49m)\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\openai\\_base_client.py:1034\u001B[0m, in \u001B[0;36mSyncAPIClient.request\u001B[1;34m(self, cast_to, options, stream, stream_cls)\u001B[0m\n\u001B[0;32m   1031\u001B[0m             err\u001B[38;5;241m.\u001B[39mresponse\u001B[38;5;241m.\u001B[39mread()\n\u001B[0;32m   1033\u001B[0m         log\u001B[38;5;241m.\u001B[39mdebug(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mRe-raising status error\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[1;32m-> 1034\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_make_status_error_from_response(err\u001B[38;5;241m.\u001B[39mresponse) \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m   1036\u001B[0m     \u001B[38;5;28;01mbreak\u001B[39;00m\n\u001B[0;32m   1038\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m response \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcould not resolve response (should never happen)\u001B[39m\u001B[38;5;124m\"\u001B[39m\n",
      "\u001B[1;31mAuthenticationError\u001B[0m: Error code: 401 - {'error': {'message': 'Incorrect API key provided. ', 'type': 'invalid_request_error', 'param': None, 'code': 'invalid_api_key'}, 'request_id': '1a619334-e4fd-49a0-914a-47cdb2574fa9'}"
     ]
    }
   ],
   "execution_count": 24
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 角度2：参数位置不同举例",
   "id": "f21805b9b812e60b"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "2.1：硬编码",
   "id": "642856cf80e399aa"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T06:40:42.020402Z",
     "start_time": "2025-10-20T06:40:21.501966Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "# 硬编码 API Key 和模型参数\n",
    "llm = ChatOpenAI(\n",
    "api_key=\"sk-9781f55fc367425c87c47abcc9f4a776\", # 明文暴露密钥\n",
    "base_url=\"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n",
    "model=\"qwen-max\",\n",
    ")\n",
    "# 调用示例\n",
    "response = llm.invoke(\"解释神经网络原理\")\n",
    "print(response.content)"
   ],
   "id": "6f7f8f93302926bc",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "神经网络是一种受生物神经系统启发的计算模型，它模仿了人脑处理信息的方式。神经网络的基本原理涉及多个层次的节点（或称为“神经元”），这些节点通过连接权重相互作用，共同完成从输入到输出的信息转换过程。下面是对神经网络工作原理的一个简要介绍：\n",
      "\n",
      "### 1. 基本结构\n",
      "\n",
      "- **层**：神经网络通常由多层组成，包括输入层、隐藏层和输出层。\n",
      "  - 输入层接收外部数据。\n",
      "  - 隐藏层位于输入层与输出层之间，可以有多层，用于提取特征。\n",
      "  - 输出层给出最终结果。\n",
      "\n",
      "- **神经元**：每一层内包含若干个神经元，每个神经元接收来自前一层所有神经元的信息，并将其加权求和后传递给下一层。\n",
      "\n",
      "### 2. 工作流程\n",
      "\n",
      "1. **前向传播**：当有新的输入数据时，数据首先通过输入层进入网络。每个神经元根据其接收到的所有输入值以及它们对应的权重进行线性组合（加权求和），然后将这个结果通过一个激活函数来决定是否以及如何将信号传递给下一层。这一过程一直持续到输出层产生预测结果为止。\n",
      "\n",
      "2. **损失计算**：比较网络产生的预测值与实际的目标值之间的差异，使用某种形式的损失函数来量化这种差异程度。\n",
      "\n",
      "3. **反向传播**：基于上述损失，利用梯度下降等优化算法调整整个网络中各条边上的权重值，以期最小化损失函数。这一步骤涉及到计算损失相对于每个权重参数的偏导数，并据此更新权重。\n",
      "\n",
      "4. **迭代训练**：重复执行前向传播、损失计算及反向传播的过程多次（即所谓的“epoch”），直到达到预设的最大迭代次数或者满足其他停止条件为止。\n",
      "\n",
      "### 3. 激活函数\n",
      "\n",
      "激活函数决定了神经元是否应该被激活及其激活强度。常见的激活函数包括Sigmoid、Tanh、ReLU等。它们的作用是引入非线性因素，使得神经网络能够学习更复杂的模式。\n",
      "\n",
      "### 4. 应用场景\n",
      "\n",
      "神经网络广泛应用于图像识别、自然语言处理、语音识别等多个领域，在解决分类、回归等问题上表现出色。\n",
      "\n",
      "总之，神经网络通过模拟大脑中的神经元工作机制，利用大量数据进行自我学习，从而能够在许多任务上实现高性能的表现。不过，正确设计并训练出有效的神经网络需要深厚的理论知识以及丰富的实践经验。\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "2.2：配置环境变量",
   "id": "7ab3607857a050b3"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T06:48:25.030837Z",
     "start_time": "2025-10-20T06:48:14.224705Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "from langchain_openai import ChatOpenAI\n",
    "# 从环境变量读取密钥\n",
    "llm = ChatOpenAI(\n",
    "api_key=os.environ[\"OPENAI_API_KEY\"], # 动态获取\n",
    "base_url=os.environ[\"OPENAI_BASE_URL\"],\n",
    "model=\"qwen-max\",\n",
    ")\n",
    "response = llm.invoke(\"LangChain 是什么？\")\n",
    "print(response.content)"
   ],
   "id": "b2343beabc90a3d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LangChain 是一个用于开发基于语言模型的应用程序的开源框架。它提供了一系列工具和库，使得开发者能够更方便地构建、连接和部署使用大型语言模型（如GPT系列）的应用。通过LangChain，用户可以轻松实现对不同类型数据源的信息检索、文本生成、对话系统等功能，并且支持多种编程语言。\n",
      "\n",
      "LangChain 的主要特点包括：\n",
      "\n",
      "1. **模块化设计**：允许开发者根据需要选择合适的组件来组装自己的应用。\n",
      "2. **易于集成**：提供了与各种流行的语言模型服务（如OpenAI, Anthropic等）以及数据库和其他API的集成方式。\n",
      "3. **灵活性高**：不仅限于特定的应用场景或技术栈，适用于广泛的自然语言处理任务。\n",
      "4. **社区支持**：作为一个开放源代码项目，拥有活跃的社区贡献者和支持者，不断更新和完善功能。\n",
      "\n",
      "总之，LangChain 旨在简化基于语言模型的应用开发过程，让更多的开发者能够利用先进的NLP技术创造出有价值的产品和服务。如果你对构建聊天机器人、智能助手或者任何涉及自然语言理解和生成的项目感兴趣的话，LangChain 或许会是一个不错的选择。\n"
     ]
    }
   ],
   "execution_count": 11
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "2.3：使用.env配置文件\n",
    "\n",
    "方式1 安全读取"
   ],
   "id": "2ec92e0ebf2c2ddf"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T06:53:25.600076Z",
     "start_time": "2025-10-20T06:53:00.695304Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from dotenv import load_dotenv\n",
    "from langchain_openai import ChatOpenAI\n",
    "import os\n",
    "load_dotenv() # 自动加载 .env 文件\n",
    "print(os.getenv(\"DASHSCOPE_API_KEY\"))\n",
    "print(os.getenv(\"DASHSCOPE_BASE_URL\"))\n",
    "llm = ChatOpenAI(\n",
    "api_key=os.getenv(\"DASHSCOPE_API_KEY\"), # 安全读取\n",
    "base_url=os.getenv(\"DASHSCOPE_BASE_URL\"),\n",
    "model=\"qwen-max\",\n",
    "temperature=0.8,\n",
    ")\n",
    "response = llm.invoke(\"RAG 技术的核心流程\")\n",
    "print(response.content)"
   ],
   "id": "9b5c3805b41f2eea",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "sk-9781f55fc367425c87c47abcc9f4a776\n",
      "https://dashscope.aliyuncs.com/compatible-mode/v1\n",
      "RAG（Retrieval-Augmented Generation）技术是一种结合了信息检索和生成模型的方法，旨在通过从外部知识源中检索相关信息来增强生成模型的输出质量。其核心流程主要包括以下几个步骤：\n",
      "\n",
      "1. **问题理解**：首先，系统需要理解用户提出的问题或请求。这一步通常涉及到自然语言处理技术，如文本预处理、语义分析等，目的是将用户的输入转化为计算机能够理解和处理的形式。\n",
      "\n",
      "2. **信息检索**：基于对问题的理解，系统会从一个或多个预先构建好的文档库中检索出与当前问题相关的文档片段。这里使用的检索方法可以是基于关键词匹配的传统搜索引擎技术，也可以是更先进的向量相似度搜索技术等。重要的是找到那些能够为接下来的生成过程提供有价值背景信息的内容。\n",
      "\n",
      "3. **上下文整合**：检索到的相关文档片段被整合进生成模型的输入之中，作为额外的上下文信息。这样做可以让生成模型在生成答案时考虑到更多的相关背景资料，从而提高回答的质量和准确性。\n",
      "\n",
      "4. **答案生成**：最后，利用经过训练的语言模型根据问题以及整合后的上下文信息生成最终的回答。这个过程中，生成模型不仅考虑了原始问题本身，还充分融入了检索所得的知识点，使得生成的答案更加丰富、准确且具有针对性。\n",
      "\n",
      "5. **结果反馈**：生成的答案会被返回给用户，并可能包括一些交互式的元素，比如允许用户提供反馈以进一步优化未来查询的结果。此外，在某些应用场景下，系统还可能会根据用户的反馈调整检索策略或是更新知识库内容。\n",
      "\n",
      "整个RAG技术的核心在于有效地将大规模外部知识与强大的语言模型相结合，从而实现既具备广泛知识覆盖能力又保持高质量响应特性的智能问答系统。\n"
     ]
    }
   ],
   "execution_count": 1
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "方式2：给os内部的环境变量赋值",
   "id": "5e36b2c80fcbb206"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T07:00:06.673279Z",
     "start_time": "2025-10-20T07:00:01.513419Z"
    }
   },
   "cell_type": "code",
   "source": [
    "from langchain_openai import ChatOpenAI\n",
    "import dotenv\n",
    "dotenv.load_dotenv()\n",
    "import os\n",
    "# os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"DASHSCOPE_API_KEY\")\n",
    "# os.environ[\"OPENAI_API_BASE\"] = os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    "text = \"猫王是猫吗？\"\n",
    "chat_model = ChatOpenAI(\n",
    "model=\"qwen-max\",\n",
    "temperature=0.7,\n",
    "max_tokens=300,\n",
    ")\n",
    "response = chat_model.invoke(text)\n",
    "print(type(response))\n",
    "print(response.content)"
   ],
   "id": "3fb857623e8ad90f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'langchain_core.messages.ai.AIMessage'>\n",
      "不是的，猫王并不是指一只猫。\"猫王\"是美国著名摇滚歌手埃尔维斯·普雷斯利（Elvis Presley）的昵称。他因为在音乐、电影等方面的巨大影响力而被人们称为“摇滚乐之王”，简称“猫王”。这个名字与实际的猫没有任何关系。\n"
     ]
    }
   ],
   "execution_count": 4
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 角度3：各平台API的调用\n",
    "3.1通过DashScope SDK"
   ],
   "id": "da86495481449e70"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T07:24:06.623100Z",
     "start_time": "2025-10-20T07:23:50.592947Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "import dashscope\n",
    "messages = [\n",
    "{'role': 'user', 'content': '你是谁？'}\n",
    "]\n",
    "response = dashscope.Generation.call(\n",
    "# 若没有配置环境变量，请用阿里云百炼API Key将下行替换为：api_key=\"sk-xxx\",\n",
    "api_key=os.getenv('DASHSCOPE_API_KEY'),\n",
    "model=\"deepseek-r1\", # 此处以 deepseek-r1 为例，可按需更换模型名称。\n",
    "messages=messages,\n",
    "# result_format参数不可以设置为\"text\"。\n",
    "result_format='message'\n",
    ")\n",
    "print(\"=\" * 20 + \"思考过程\" + \"=\" * 20)\n",
    "print(response.output.choices[0].message.reasoning_content)\n",
    "print(\"=\" * 20 + \"最终答案\" + \"=\" * 20)\n",
    "print(response.output.choices[0].message.content)"
   ],
   "id": "2897c95491845292",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "====================思考过程====================\n",
      "嗯，用户问了一个非常基础但也很关键的问题——“你是谁”。这可能是第一次使用智能助手的用户，也可能是想确认当前对话对象的身份。  \n",
      "\n",
      "用户可能带着试探或好奇的心态，需要明确我的功能和边界。ta或许刚打开聊天界面，甚至没注意到我的名字和介绍。这时候需要最简洁的自我介绍，同时传递温暖感——毕竟第一印象很重要。  \n",
      "\n",
      "重点要突出三点：身份（DeepSeek-R1）、归属（深度求索公司）、核心能力（文本处理）。用“小伙伴”降低距离感，用表情符号营造轻松氛围。最后一句开放提问能引导对话继续，避免自我介绍变成机械的公告。  \n",
      "\n",
      "对了，用户没提供任何背景信息，所以回答要保持零门槛。如果后续对话中ta表现出更专业的需求，再调整沟通方式也不迟。\n",
      "====================最终答案====================\n",
      "你好呀！我是 **DeepSeek-R1**，是由中国的科技公司「深度求索（DeepSeek）」研发的一款智能助手。你可以把我当作一个聪明又热心的小伙伴，随时帮你解答问题、整理资料、写作润色、学习辅导、工作支持……只要是用文字能表达的事情，我都可以尽力帮你搞定！\n",
      "\n",
      "我的知识更新到 **2024年7月**，现在可以读取你上传的文档（比如PDF、Word、Excel等），帮你总结、提取信息或分析内容。目前我还是**完全免费**的，也没有语音功能，但文字交流可是我的强项 😄\n",
      "\n",
      "如果你愿意，可以叫我“小深”或者“DeepSeek”～  \n",
      "有什么我可以帮你的吗？🌟\n"
     ]
    }
   ],
   "execution_count": 25
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "调用对话模型：",
   "id": "789be4e984702c20"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T07:19:04.187880Z",
     "start_time": "2025-10-20T07:18:23.509339Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "from openai import OpenAI\n",
    "client = OpenAI(\n",
    "# 若没有配置环境变量，请用阿里云百炼API Key将下行替换为：api_key=\"sk-xxx\",\n",
    "api_key=os.getenv(\"DASHSCOPE_API_KEY\"), # 如何获取API Key：https://help.aliyun.com/zh/model-studio/developer-reference/get-api-key\n",
    "base_url=os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    ")\n",
    "completion = client.chat.completions.create(\n",
    "model=\"deepseek-r1\", # 此处以 deepseek-r1 为例，可按需更换模型名称。\n",
    "messages=[\n",
    "{'role': 'user', 'content': '9.9和9.11谁大'}\n",
    "]\n",
    ")\n",
    "# 通过reasoning_content字段打印思考过程\n",
    "print(\"思考过程：\")\n",
    "print(completion.choices[0].message.reasoning_content)\n",
    "# 通过content字段打印最终答案\n",
    "print(\"最终答案：\")\n",
    "print(completion.choices[0].message.content)"
   ],
   "id": "65a97c65f958a573",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "思考过程：\n",
      "首先，用户的问题是：“9.9和9.11谁大”，这看起来是在比较两个数字：9.9 和 9.11。我需要确定哪个数字更大。\n",
      "\n",
      "9.9 表示九点九，即 9 + 9/10 = 9.9。\n",
      "\n",
      "9.11 表示九点一一，即 9 + 11/100 = 9.11。\n",
      "\n",
      "为了比较它们，我可以将它们转换为小数形式。\n",
      "\n",
      "- 9.9 等于 9.90（因为在小数点后添加零不会改变其值）。\n",
      "\n",
      "- 9.11 就是 9.11。\n",
      "\n",
      "现在，比较 9.90 和 9.11。\n",
      "\n",
      "从整数部分开始：两者都有整数部分 9，所以整数部分相同。\n",
      "\n",
      "接下来，比较小数部分：\n",
      "\n",
      "- 9.90 的小数部分是 0.90\n",
      "\n",
      "- 9.11 的小数部分是 0.11\n",
      "\n",
      "0.90 大于 0.11，因为 90/100 > 11/100。\n",
      "\n",
      "因此，9.90 > 9.11，所以 9.9 > 9.11。\n",
      "\n",
      "我也可以将它们视为分数：\n",
      "\n",
      "- 9.9 = 99/10\n",
      "\n",
      "- 9.11 = 911/100\n",
      "\n",
      "为了比较 99/10 和 911/100，我可以找到一个公分母。\n",
      "\n",
      "公分母是 100。\n",
      "\n",
      "99/10 = (99 * 10) / (10 * 10) = 990/100？不，这是错误的。\n",
      "\n",
      "99/10 = (99 * 10) / (10 * 10)？不，分子和分母都乘以相同的数。\n",
      "\n",
      "要得到分母 100，将分子和分母都乘以 10：\n",
      "\n",
      "99/10 = (99 * 10) / (10 * 10) = 990 / 100\n",
      "\n",
      "99 * 10 = 990，10 * 10 = 100，所以 990/100。\n",
      "\n",
      "现在，9.11 = 911/100。\n",
      "\n",
      "所以，比较 990/100 和 911/100。\n",
      "\n",
      "既然分母相同，比较分子：990 和 911。\n",
      "\n",
      "990 > 911，所以 990/100 > 911/100，因此 9.9 > 9.11。\n",
      "\n",
      "用户可能误写了数字，或者是测试理解。9.11 通常被理解为九点一一，而不是九十一分之一。在中文中，“9.11” 可能被误解，但根据标准小数表示，应该是 9.11。\n",
      "\n",
      "另一个想法：用户可能在比较版本号或日期，但问题中指定了“谁大”，意思是“谁更大”，在数字上下文中，通常是数值比较。\n",
      "\n",
      "9.11 可能被误读为 9/11，但问题中写的是“9.11”，有小数点，所以应该是小数。\n",
      "\n",
      "在问题中是“9.9和9.11”，所以都是小数。\n",
      "\n",
      "确认小数比较：\n",
      "\n",
      "9.9 = 9.90\n",
      "\n",
      "9.11 = 9.11\n",
      "\n",
      "比较小数点后第一位：9.9 的第一位是9，9.11的第一位是1。9 > 1，所以9.9 > 9.11。\n",
      "\n",
      "不需要进一步比较。\n",
      "\n",
      "例如，9.9 比 9.10 大，但9.10 是9.1，而9.11 是9.11，小于9.9。\n",
      "\n",
      "9.10 是9.1，但9.9 是9.9，所以9.9 > 9.1。\n",
      "\n",
      "同样，9.11 < 9.9。\n",
      "\n",
      "数值上，9.9 = 9.90，9.11 = 9.11，所以9.90 - 9.11 = 0.79 > 0，因此9.9更大。\n",
      "\n",
      "用户可能困惑于9.11的小数点后两位，但9.9只有一位。但通过添加零，可以比较。\n",
      "\n",
      "在一些上下文中，9.11 可能被误解，但标准数学中，9.9 大于 9.11。\n",
      "\n",
      "例如，9.9 是九点九，9.11 是九点一一，九点九大于九点一一。\n",
      "\n",
      "所以，答案应该是9.9更大。\n",
      "\n",
      "问题是用中文写的：“9.9和9.11谁大”，所以回答也用中文。\n",
      "\n",
      "最终答案：9.9 比 9.11 大。\n",
      "\n",
      "为了清晰，我可以说：9.9 大于 9.11。\n",
      "\n",
      "或者直接：9.9大。\n",
      "\n",
      "但完整回答更好。\n",
      "最终答案：\n",
      "9.9 和 9.11 比较大小，需要从小数的角度进行分析。\n",
      "\n",
      "- 9.9 表示九点九，即 9.90（在小数点后添加零不改变其值）。\n",
      "- 9.11 表示九点一一，即 9.11。\n",
      "\n",
      "比较时，先看整数部分（都是 9），然后看小数部分：\n",
      "- 9.90 的小数部分是 0.90。\n",
      "- 9.11 的小数部分是 0.11。\n",
      "\n",
      "因为 0.90 > 0.11，所以 9.90 > 9.11，即 **9.9 大于 9.11**。\n",
      "\n",
      "### 详细解释：\n",
      "- 可以将两个数转换为分数形式：\n",
      "  - 9.9 = 99/10 = 990/100（分子和分母同乘 10）。\n",
      "  - 9.11 = 911/100。\n",
      "  - 比较 990/100 和 911/100：分母相同，分子 990 > 911，因此 990/100 > 911/100。\n",
      "- 或者直接相减：9.90 - 9.11 = 0.79 > 0，证明 9.9 更大。\n",
      "\n",
      "因此，**9.9 比 9.11 大**。如果您的查询有其他上下文（如版本号），请提供更多细节，我可以进一步解释！\n"
     ]
    }
   ],
   "execution_count": 22
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "# 5.2获取大模型的标准方式\n",
    "5.2.1 非对话模型"
   ],
   "id": "80f8d93c3fbb9f55"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T22:41:40.507827Z",
     "start_time": "2025-10-20T22:41:40.154446Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import OpenAI\n",
    "dotenv.load_dotenv()\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"DASHSCOPE_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    "llm = OpenAI(\n",
    "    model=\"qwen-max\",\n",
    "    temperature=0.7,\n",
    "    max_tokens=100,\n",
    ")\n",
    "str = llm.invoke(\"写一首关于春天的诗\")\n",
    "print(str.content)"
   ],
   "id": "1afa516d44a18321",
   "outputs": [
    {
     "ename": "NotFoundError",
     "evalue": "Error code: 404 - {'error': {'code': 'model_not_supported', 'param': None, 'message': 'Unsupported model `qwen-max` for OpenAI compatibility mode.', 'type': 'invalid_request_error'}, 'request_id': 'be1e63d7-0250-489d-8c9c-d5f98c745860'}",
     "output_type": "error",
     "traceback": [
      "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
      "\u001B[1;31mNotFoundError\u001B[0m                             Traceback (most recent call last)",
      "Cell \u001B[1;32mIn[32], line 12\u001B[0m\n\u001B[0;32m      6\u001B[0m os\u001B[38;5;241m.\u001B[39menviron[\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mOPENAI_BASE_URL\u001B[39m\u001B[38;5;124m\"\u001B[39m] \u001B[38;5;241m=\u001B[39m os\u001B[38;5;241m.\u001B[39mgetenv(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mDASHSCOPE_BASE_URL\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[0;32m      7\u001B[0m llm \u001B[38;5;241m=\u001B[39m OpenAI(\n\u001B[0;32m      8\u001B[0m     model\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mqwen-max\u001B[39m\u001B[38;5;124m\"\u001B[39m,\n\u001B[0;32m      9\u001B[0m     temperature\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m0.7\u001B[39m,\n\u001B[0;32m     10\u001B[0m     max_tokens\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m100\u001B[39m,\n\u001B[0;32m     11\u001B[0m )\n\u001B[1;32m---> 12\u001B[0m \u001B[38;5;28mstr\u001B[39m \u001B[38;5;241m=\u001B[39m \u001B[43mllm\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43minvoke\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43m写一首关于春天的诗\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[0;32m     13\u001B[0m \u001B[38;5;28mprint\u001B[39m(\u001B[38;5;28mstr\u001B[39m\u001B[38;5;241m.\u001B[39mcontent)\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_core\\language_models\\llms.py:389\u001B[0m, in \u001B[0;36mBaseLLM.invoke\u001B[1;34m(self, input, config, stop, **kwargs)\u001B[0m\n\u001B[0;32m    378\u001B[0m \u001B[38;5;129m@override\u001B[39m\n\u001B[0;32m    379\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21minvoke\u001B[39m(\n\u001B[0;32m    380\u001B[0m     \u001B[38;5;28mself\u001B[39m,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    385\u001B[0m     \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs: Any,\n\u001B[0;32m    386\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m \u001B[38;5;28mstr\u001B[39m:\n\u001B[0;32m    387\u001B[0m     config \u001B[38;5;241m=\u001B[39m ensure_config(config)\n\u001B[0;32m    388\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m (\n\u001B[1;32m--> 389\u001B[0m         \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mgenerate_prompt(\n\u001B[0;32m    390\u001B[0m             [\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_convert_input(\u001B[38;5;28minput\u001B[39m)],\n\u001B[0;32m    391\u001B[0m             stop\u001B[38;5;241m=\u001B[39mstop,\n\u001B[0;32m    392\u001B[0m             callbacks\u001B[38;5;241m=\u001B[39mconfig\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcallbacks\u001B[39m\u001B[38;5;124m\"\u001B[39m),\n\u001B[0;32m    393\u001B[0m             tags\u001B[38;5;241m=\u001B[39mconfig\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtags\u001B[39m\u001B[38;5;124m\"\u001B[39m),\n\u001B[0;32m    394\u001B[0m             metadata\u001B[38;5;241m=\u001B[39mconfig\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmetadata\u001B[39m\u001B[38;5;124m\"\u001B[39m),\n\u001B[0;32m    395\u001B[0m             run_name\u001B[38;5;241m=\u001B[39mconfig\u001B[38;5;241m.\u001B[39mget(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrun_name\u001B[39m\u001B[38;5;124m\"\u001B[39m),\n\u001B[0;32m    396\u001B[0m             run_id\u001B[38;5;241m=\u001B[39mconfig\u001B[38;5;241m.\u001B[39mpop(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mrun_id\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28;01mNone\u001B[39;00m),\n\u001B[0;32m    397\u001B[0m             \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[0;32m    398\u001B[0m         )\n\u001B[0;32m    399\u001B[0m         \u001B[38;5;241m.\u001B[39mgenerations[\u001B[38;5;241m0\u001B[39m][\u001B[38;5;241m0\u001B[39m]\n\u001B[0;32m    400\u001B[0m         \u001B[38;5;241m.\u001B[39mtext\n\u001B[0;32m    401\u001B[0m     )\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_core\\language_models\\llms.py:766\u001B[0m, in \u001B[0;36mBaseLLM.generate_prompt\u001B[1;34m(self, prompts, stop, callbacks, **kwargs)\u001B[0m\n\u001B[0;32m    757\u001B[0m \u001B[38;5;129m@override\u001B[39m\n\u001B[0;32m    758\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mgenerate_prompt\u001B[39m(\n\u001B[0;32m    759\u001B[0m     \u001B[38;5;28mself\u001B[39m,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    763\u001B[0m     \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs: Any,\n\u001B[0;32m    764\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m LLMResult:\n\u001B[0;32m    765\u001B[0m     prompt_strings \u001B[38;5;241m=\u001B[39m [p\u001B[38;5;241m.\u001B[39mto_string() \u001B[38;5;28;01mfor\u001B[39;00m p \u001B[38;5;129;01min\u001B[39;00m prompts]\n\u001B[1;32m--> 766\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mgenerate(prompt_strings, stop\u001B[38;5;241m=\u001B[39mstop, callbacks\u001B[38;5;241m=\u001B[39mcallbacks, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_core\\language_models\\llms.py:971\u001B[0m, in \u001B[0;36mBaseLLM.generate\u001B[1;34m(self, prompts, stop, callbacks, tags, metadata, run_name, run_id, **kwargs)\u001B[0m\n\u001B[0;32m    956\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m (\u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcache \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;129;01mand\u001B[39;00m get_llm_cache() \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m) \u001B[38;5;129;01mor\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mcache \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mFalse\u001B[39;00m:\n\u001B[0;32m    957\u001B[0m     run_managers \u001B[38;5;241m=\u001B[39m [\n\u001B[0;32m    958\u001B[0m         callback_manager\u001B[38;5;241m.\u001B[39mon_llm_start(\n\u001B[0;32m    959\u001B[0m             \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_serialized,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    969\u001B[0m         )\n\u001B[0;32m    970\u001B[0m     ]\n\u001B[1;32m--> 971\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_generate_helper(\n\u001B[0;32m    972\u001B[0m         prompts,\n\u001B[0;32m    973\u001B[0m         stop,\n\u001B[0;32m    974\u001B[0m         run_managers,\n\u001B[0;32m    975\u001B[0m         new_arg_supported\u001B[38;5;241m=\u001B[39m\u001B[38;5;28mbool\u001B[39m(new_arg_supported),\n\u001B[0;32m    976\u001B[0m         \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[0;32m    977\u001B[0m     )\n\u001B[0;32m    978\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(missing_prompts) \u001B[38;5;241m>\u001B[39m \u001B[38;5;241m0\u001B[39m:\n\u001B[0;32m    979\u001B[0m     run_managers \u001B[38;5;241m=\u001B[39m [\n\u001B[0;32m    980\u001B[0m         callback_managers[idx]\u001B[38;5;241m.\u001B[39mon_llm_start(\n\u001B[0;32m    981\u001B[0m             \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_serialized,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    988\u001B[0m         \u001B[38;5;28;01mfor\u001B[39;00m idx \u001B[38;5;129;01min\u001B[39;00m missing_prompt_idxs\n\u001B[0;32m    989\u001B[0m     ]\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_core\\language_models\\llms.py:792\u001B[0m, in \u001B[0;36mBaseLLM._generate_helper\u001B[1;34m(self, prompts, stop, run_managers, new_arg_supported, **kwargs)\u001B[0m\n\u001B[0;32m    781\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21m_generate_helper\u001B[39m(\n\u001B[0;32m    782\u001B[0m     \u001B[38;5;28mself\u001B[39m,\n\u001B[0;32m    783\u001B[0m     prompts: \u001B[38;5;28mlist\u001B[39m[\u001B[38;5;28mstr\u001B[39m],\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    788\u001B[0m     \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs: Any,\n\u001B[0;32m    789\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m LLMResult:\n\u001B[0;32m    790\u001B[0m     \u001B[38;5;28;01mtry\u001B[39;00m:\n\u001B[0;32m    791\u001B[0m         output \u001B[38;5;241m=\u001B[39m (\n\u001B[1;32m--> 792\u001B[0m             \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_generate(\n\u001B[0;32m    793\u001B[0m                 prompts,\n\u001B[0;32m    794\u001B[0m                 stop\u001B[38;5;241m=\u001B[39mstop,\n\u001B[0;32m    795\u001B[0m                 \u001B[38;5;66;03m# TODO: support multiple run managers\u001B[39;00m\n\u001B[0;32m    796\u001B[0m                 run_manager\u001B[38;5;241m=\u001B[39mrun_managers[\u001B[38;5;241m0\u001B[39m] \u001B[38;5;28;01mif\u001B[39;00m run_managers \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m,\n\u001B[0;32m    797\u001B[0m                 \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[0;32m    798\u001B[0m             )\n\u001B[0;32m    799\u001B[0m             \u001B[38;5;28;01mif\u001B[39;00m new_arg_supported\n\u001B[0;32m    800\u001B[0m             \u001B[38;5;28;01melse\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_generate(prompts, stop\u001B[38;5;241m=\u001B[39mstop)\n\u001B[0;32m    801\u001B[0m         )\n\u001B[0;32m    802\u001B[0m     \u001B[38;5;28;01mexcept\u001B[39;00m \u001B[38;5;167;01mBaseException\u001B[39;00m \u001B[38;5;28;01mas\u001B[39;00m e:\n\u001B[0;32m    803\u001B[0m         \u001B[38;5;28;01mfor\u001B[39;00m run_manager \u001B[38;5;129;01min\u001B[39;00m run_managers:\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\langchain_openai\\llms\\base.py:330\u001B[0m, in \u001B[0;36mBaseOpenAI._generate\u001B[1;34m(self, prompts, stop, run_manager, **kwargs)\u001B[0m\n\u001B[0;32m    314\u001B[0m     choices\u001B[38;5;241m.\u001B[39mappend(\n\u001B[0;32m    315\u001B[0m         {\n\u001B[0;32m    316\u001B[0m             \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mtext\u001B[39m\u001B[38;5;124m\"\u001B[39m: generation\u001B[38;5;241m.\u001B[39mtext,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    327\u001B[0m         }\n\u001B[0;32m    328\u001B[0m     )\n\u001B[0;32m    329\u001B[0m \u001B[38;5;28;01melse\u001B[39;00m:\n\u001B[1;32m--> 330\u001B[0m     response \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39mclient\u001B[38;5;241m.\u001B[39mcreate(prompt\u001B[38;5;241m=\u001B[39m_prompts, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mparams)\n\u001B[0;32m    331\u001B[0m     \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28misinstance\u001B[39m(response, \u001B[38;5;28mdict\u001B[39m):\n\u001B[0;32m    332\u001B[0m         \u001B[38;5;66;03m# V1 client returns the response in an PyDantic object instead of\u001B[39;00m\n\u001B[0;32m    333\u001B[0m         \u001B[38;5;66;03m# dict. For the transition period, we deep convert it to dict.\u001B[39;00m\n\u001B[0;32m    334\u001B[0m         response \u001B[38;5;241m=\u001B[39m response\u001B[38;5;241m.\u001B[39mmodel_dump()\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\openai\\_utils\\_utils.py:287\u001B[0m, in \u001B[0;36mrequired_args.<locals>.inner.<locals>.wrapper\u001B[1;34m(*args, **kwargs)\u001B[0m\n\u001B[0;32m    285\u001B[0m             msg \u001B[38;5;241m=\u001B[39m \u001B[38;5;124mf\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mMissing required argument: \u001B[39m\u001B[38;5;132;01m{\u001B[39;00mquote(missing[\u001B[38;5;241m0\u001B[39m])\u001B[38;5;132;01m}\u001B[39;00m\u001B[38;5;124m\"\u001B[39m\n\u001B[0;32m    286\u001B[0m     \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mTypeError\u001B[39;00m(msg)\n\u001B[1;32m--> 287\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m func(\u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\openai\\resources\\completions.py:541\u001B[0m, in \u001B[0;36mCompletions.create\u001B[1;34m(self, model, prompt, best_of, echo, frequency_penalty, logit_bias, logprobs, max_tokens, n, presence_penalty, seed, stop, stream, stream_options, suffix, temperature, top_p, user, extra_headers, extra_query, extra_body, timeout)\u001B[0m\n\u001B[0;32m    512\u001B[0m \u001B[38;5;129m@required_args\u001B[39m([\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmodel\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mprompt\u001B[39m\u001B[38;5;124m\"\u001B[39m], [\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mmodel\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mprompt\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mstream\u001B[39m\u001B[38;5;124m\"\u001B[39m])\n\u001B[0;32m    513\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mcreate\u001B[39m(\n\u001B[0;32m    514\u001B[0m     \u001B[38;5;28mself\u001B[39m,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m    539\u001B[0m     timeout: \u001B[38;5;28mfloat\u001B[39m \u001B[38;5;241m|\u001B[39m httpx\u001B[38;5;241m.\u001B[39mTimeout \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;241m|\u001B[39m NotGiven \u001B[38;5;241m=\u001B[39m NOT_GIVEN,\n\u001B[0;32m    540\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m Completion \u001B[38;5;241m|\u001B[39m Stream[Completion]:\n\u001B[1;32m--> 541\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43m_post\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    542\u001B[0m \u001B[43m        \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43m/completions\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m,\u001B[49m\n\u001B[0;32m    543\u001B[0m \u001B[43m        \u001B[49m\u001B[43mbody\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmaybe_transform\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    544\u001B[0m \u001B[43m            \u001B[49m\u001B[43m{\u001B[49m\n\u001B[0;32m    545\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmodel\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmodel\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    546\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mprompt\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mprompt\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    547\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mbest_of\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mbest_of\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    548\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mecho\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mecho\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    549\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mfrequency_penalty\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mfrequency_penalty\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    550\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mlogit_bias\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mlogit_bias\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    551\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mlogprobs\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mlogprobs\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    552\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mmax_tokens\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mmax_tokens\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    553\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mn\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mn\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    554\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mpresence_penalty\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mpresence_penalty\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    555\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mseed\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mseed\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    556\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstop\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mstop\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    557\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstream\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    558\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mstream_options\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream_options\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    559\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43msuffix\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43msuffix\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    560\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtemperature\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mtemperature\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    561\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mtop_p\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mtop_p\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    562\u001B[0m \u001B[43m                \u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43muser\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43muser\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    563\u001B[0m \u001B[43m            \u001B[49m\u001B[43m}\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    564\u001B[0m \u001B[43m            \u001B[49m\u001B[43mcompletion_create_params\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mCompletionCreateParamsStreaming\u001B[49m\n\u001B[0;32m    565\u001B[0m \u001B[43m            \u001B[49m\u001B[38;5;28;43;01mif\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\n\u001B[0;32m    566\u001B[0m \u001B[43m            \u001B[49m\u001B[38;5;28;43;01melse\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mcompletion_create_params\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mCompletionCreateParamsNonStreaming\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    567\u001B[0m \u001B[43m        \u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    568\u001B[0m \u001B[43m        \u001B[49m\u001B[43moptions\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mmake_request_options\u001B[49m\u001B[43m(\u001B[49m\n\u001B[0;32m    569\u001B[0m \u001B[43m            \u001B[49m\u001B[43mextra_headers\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_headers\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mextra_query\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_query\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mextra_body\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mextra_body\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mtimeout\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mtimeout\u001B[49m\n\u001B[0;32m    570\u001B[0m \u001B[43m        \u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    571\u001B[0m \u001B[43m        \u001B[49m\u001B[43mcast_to\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mCompletion\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    572\u001B[0m \u001B[43m        \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01mor\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mFalse\u001B[39;49;00m\u001B[43m,\u001B[49m\n\u001B[0;32m    573\u001B[0m \u001B[43m        \u001B[49m\u001B[43mstream_cls\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mStream\u001B[49m\u001B[43m[\u001B[49m\u001B[43mCompletion\u001B[49m\u001B[43m]\u001B[49m\u001B[43m,\u001B[49m\n\u001B[0;32m    574\u001B[0m \u001B[43m    \u001B[49m\u001B[43m)\u001B[49m\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\openai\\_base_client.py:1239\u001B[0m, in \u001B[0;36mSyncAPIClient.post\u001B[1;34m(self, path, cast_to, body, options, files, stream, stream_cls)\u001B[0m\n\u001B[0;32m   1225\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;21mpost\u001B[39m(\n\u001B[0;32m   1226\u001B[0m     \u001B[38;5;28mself\u001B[39m,\n\u001B[0;32m   1227\u001B[0m     path: \u001B[38;5;28mstr\u001B[39m,\n\u001B[1;32m   (...)\u001B[0m\n\u001B[0;32m   1234\u001B[0m     stream_cls: \u001B[38;5;28mtype\u001B[39m[_StreamT] \u001B[38;5;241m|\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m \u001B[38;5;241m=\u001B[39m \u001B[38;5;28;01mNone\u001B[39;00m,\n\u001B[0;32m   1235\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m ResponseT \u001B[38;5;241m|\u001B[39m _StreamT:\n\u001B[0;32m   1236\u001B[0m     opts \u001B[38;5;241m=\u001B[39m FinalRequestOptions\u001B[38;5;241m.\u001B[39mconstruct(\n\u001B[0;32m   1237\u001B[0m         method\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mpost\u001B[39m\u001B[38;5;124m\"\u001B[39m, url\u001B[38;5;241m=\u001B[39mpath, json_data\u001B[38;5;241m=\u001B[39mbody, files\u001B[38;5;241m=\u001B[39mto_httpx_files(files), \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39moptions\n\u001B[0;32m   1238\u001B[0m     )\n\u001B[1;32m-> 1239\u001B[0m     \u001B[38;5;28;01mreturn\u001B[39;00m cast(ResponseT, \u001B[38;5;28;43mself\u001B[39;49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mrequest\u001B[49m\u001B[43m(\u001B[49m\u001B[43mcast_to\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mopts\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mstream_cls\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mstream_cls\u001B[49m\u001B[43m)\u001B[49m)\n",
      "File \u001B[1;32mD:\\ProgramData\\miniconda3\\envs\\pyth310\\lib\\site-packages\\openai\\_base_client.py:1034\u001B[0m, in \u001B[0;36mSyncAPIClient.request\u001B[1;34m(self, cast_to, options, stream, stream_cls)\u001B[0m\n\u001B[0;32m   1031\u001B[0m             err\u001B[38;5;241m.\u001B[39mresponse\u001B[38;5;241m.\u001B[39mread()\n\u001B[0;32m   1033\u001B[0m         log\u001B[38;5;241m.\u001B[39mdebug(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mRe-raising status error\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[1;32m-> 1034\u001B[0m         \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_make_status_error_from_response(err\u001B[38;5;241m.\u001B[39mresponse) \u001B[38;5;28;01mfrom\u001B[39;00m\u001B[38;5;250m \u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m\n\u001B[0;32m   1036\u001B[0m     \u001B[38;5;28;01mbreak\u001B[39;00m\n\u001B[0;32m   1038\u001B[0m \u001B[38;5;28;01massert\u001B[39;00m response \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;129;01mnot\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m, \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mcould not resolve response (should never happen)\u001B[39m\u001B[38;5;124m\"\u001B[39m\n",
      "\u001B[1;31mNotFoundError\u001B[0m: Error code: 404 - {'error': {'code': 'model_not_supported', 'param': None, 'message': 'Unsupported model `qwen-max` for OpenAI compatibility mode.', 'type': 'invalid_request_error'}, 'request_id': 'be1e63d7-0250-489d-8c9c-d5f98c745860'}"
     ]
    }
   ],
   "execution_count": 32
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "5.2.2 对话模型",
   "id": "221613f7190dc3da"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-10-20T22:45:40.773992Z",
     "start_time": "2025-10-20T22:45:25.001927Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import os\n",
    "import dotenv\n",
    "from langchain_openai import ChatOpenAI\n",
    "dotenv.load_dotenv()\n",
    "os.environ[\"OPENAI_API_KEY\"] = os.getenv(\"DASHSCOPE_API_KEY\")\n",
    "os.environ[\"OPENAI_BASE_URL\"] = os.getenv(\"DASHSCOPE_BASE_URL\")\n",
    "chat_model = ChatOpenAI(\n",
    "model=\"qwen-max\",\n",
    "temperature=0.7,\n",
    "max_tokens=300,\n",
    ")\n",
    "response = chat_model.invoke(\"介绍一下langchain？\")\n",
    "print(response.content)\n",
    "print(response)"
   ],
   "id": "25e50eab85a5d2b5",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LangChain 是一个用于开发基于语言模型的应用程序的开源框架。它由 Harrison Chase 创建，并且在 GitHub 上开源，旨在简化与大语言模型（如 GPT-3、Claude 等）交互的过程，同时提供了一套工具和库来帮助开发者更高效地构建复杂的应用场景。以下是 LangChain 的几个关键特点：\n",
      "\n",
      "1. **模块化设计**：LangChain 提供了多个组件，包括数据加载器、文本分割器、嵌入生成器等，这些组件可以灵活组合以满足不同的应用场景需求。\n",
      "\n",
      "2. **支持多种语言模型**：虽然最初是为与特定的大规模预训练模型（比如 OpenAI 的 GPT 系列）集成而设计的，但 LangChain 也逐渐增加了对其他类型的语言模型的支持，使得用户可以根据自己的偏好选择合适的模型。\n",
      "\n",
      "3. **易于扩展**：除了内置的功能外，LangChain 还鼓励社区贡献新功能或改进现有组件，这有助于保持其活力并适应快速变化的技术环境。\n",
      "\n",
      "4. **丰富的示例项目**：为了帮助新手快速上手，LangChain 提供了大量的教程和案例研究，涵盖了从简单的问答系统到复杂的多轮对话应用等多种场景。\n",
      "\n",
      "5. **促进最佳实践**：通过提供一系列经过验证的设计模式和实现方法，LangChain 帮助开发者避免常见的陷阱，从而能够更加专注于解决实际问题而不是基础架构层面的问题。\n",
      "\n",
      "总之，LangChain 是一个强大且灵活的工具集，特别适合那些希望利用先进自然语言处理技术来创建创新性应用程序的人士使用。无论你是想要构建聊天机器人、内容生成服务还是其他类型的AI驱动产品，LangChain 都能为你提供强有力的支持。\n",
      "content='LangChain 是一个用于开发基于语言模型的应用程序的开源框架。它由 Harrison Chase 创建，并且在 GitHub 上开源，旨在简化与大语言模型（如 GPT-3、Claude 等）交互的过程，同时提供了一套工具和库来帮助开发者更高效地构建复杂的应用场景。以下是 LangChain 的几个关键特点：\\n\\n1. **模块化设计**：LangChain 提供了多个组件，包括数据加载器、文本分割器、嵌入生成器等，这些组件可以灵活组合以满足不同的应用场景需求。\\n\\n2. **支持多种语言模型**：虽然最初是为与特定的大规模预训练模型（比如 OpenAI 的 GPT 系列）集成而设计的，但 LangChain 也逐渐增加了对其他类型的语言模型的支持，使得用户可以根据自己的偏好选择合适的模型。\\n\\n3. **易于扩展**：除了内置的功能外，LangChain 还鼓励社区贡献新功能或改进现有组件，这有助于保持其活力并适应快速变化的技术环境。\\n\\n4. **丰富的示例项目**：为了帮助新手快速上手，LangChain 提供了大量的教程和案例研究，涵盖了从简单的问答系统到复杂的多轮对话应用等多种场景。\\n\\n5. **促进最佳实践**：通过提供一系列经过验证的设计模式和实现方法，LangChain 帮助开发者避免常见的陷阱，从而能够更加专注于解决实际问题而不是基础架构层面的问题。\\n\\n总之，LangChain 是一个强大且灵活的工具集，特别适合那些希望利用先进自然语言处理技术来创建创新性应用程序的人士使用。无论你是想要构建聊天机器人、内容生成服务还是其他类型的AI驱动产品，LangChain 都能为你提供强有力的支持。' additional_kwargs={'refusal': None} response_metadata={'token_usage': {'completion_tokens': 356, 'prompt_tokens': 12, 'total_tokens': 368, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}}, 'model_name': 'qwen-max', 'system_fingerprint': None, 'id': 'chatcmpl-94e0e63c-7554-4ca5-90b1-c2ba93db0cf8', 'service_tier': None, 'finish_reason': 'stop', 'logprobs': None} id='run--3bbafe5f-aa7d-42f6-8034-93c77aefec7f-0' usage_metadata={'input_tokens': 12, 'output_tokens': 356, 'total_tokens': 368, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}\n"
     ]
    }
   ],
   "execution_count": 34
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
